extends Node2D
class_name WorldDuplicator

@export var map_width: float = 3000.0 # 地图宽度
@export var map_height: float = 3000.0 # 地图高度
@export var world_wrapper_path: NodePath # 连接到WorldWrap节点

var world_wrapper: WorldWrap
var map_node: Node2D # 原始地图节点
var map_duplicates = [] # 存储地图副本
var camera = null # 玩家相机

# 相机视口检测阈值
@export var threshold: float = 200.0

func _ready():
	# 检索必要的节点
	world_wrapper = get_node(world_wrapper_path) if world_wrapper_path else get_node("../WorldWrap")
	map_node = get_node("../World/TileMap")
	
	# 找到玩家相机
	var player = get_node("../World/Player")
	if player:
		camera = player.get_node("Camera2D") if player.has_node("Camera2D") else null
	
	# 创建地图副本
	create_map_duplicates()

# 创建8个地图副本，围绕原始地图
func create_map_duplicates():
	if !map_node:
		push_error("没有找到地图节点!")
		return
	
	# 复制地图节点
	var directions = [
		Vector2(-1, -1), Vector2(0, -1), Vector2(1, -1),
		Vector2(-1, 0),                   Vector2(1, 0),
		Vector2(-1, 1),  Vector2(0, 1),  Vector2(1, 1)
	]
	
	for dir in directions:
		var duplicate = map_node.duplicate()
		duplicate.position = Vector2(dir.x * map_width, dir.y * map_height)
		get_parent().add_child(duplicate)
		map_duplicates.append(duplicate)

# 处理相机位置变化，调整地图副本的可见性
func _process(_delta):
	if camera == null:
		return
	
	var camera_position = camera.get_screen_center_position()
	
	# 根据相机位置更新地图副本的可见性
	update_map_visibility(camera_position)
	
	# 当玩家接近边界时，预先加载另一侧的内容
	check_preload_boundary(camera_position)

# 更新地图副本的可见性
func update_map_visibility(camera_position: Vector2):
	# 获取视口大小
	var viewport_size = get_viewport_rect().size
	var visible_rect = Rect2(
		camera_position - viewport_size / 2,
		viewport_size
	)
	
	# 扩大可见区域以允许平滑过渡
	visible_rect = visible_rect.grow(threshold)
	
	# 更新每个副本的可见性
	for duplicate in map_duplicates:
		var duplicate_rect = Rect2(
			duplicate.position,
			Vector2(map_width, map_height)
		)
		
		# 如果副本与可见区域相交，则显示它
		duplicate.visible = visible_rect.intersects(duplicate_rect)

# 检查并预加载临近边界的内容
func check_preload_boundary(camera_position: Vector2):
	# 检查是否接近地图边缘
	var near_left = camera_position.x < threshold
	var near_right = camera_position.x > map_width - threshold
	var near_top = camera_position.y < threshold
	var near_bottom = camera_position.y > map_height - threshold
	
	# 根据接近的边界更新敌人的位置和可见性
	# 这部分在实际游戏中可能需要更复杂的逻辑
	if near_left or near_right or near_top or near_bottom:
		update_enemies_visibility(camera_position)

# 更新敌人在边界附近的可见性和位置
func update_enemies_visibility(camera_position: Vector2):
	if world_wrapper == null:
		return
	
	# 这里可以添加更复杂的逻辑，以在玩家接近边界时
	# 临时复制敌人到对面边界，实现视觉上的连续性
	pass 